#! /bin/bash

function inicializarVariablesDefault {

	CURRDIR=$grupo
	CONFDIR=$grupo/conf
	DATAMAE=$grupo/mae
	LIBDIR=$grupo/lib
	BINDIR=$grupo/bin
	ARRIDIR=$grupo/arribos
	DATASIZE=100
	LOGDIR=$grupo/log
	LOGEXT=.log
	MAXLOGSIZE=400

}

function leerVariablesDeConfiguracion {

	CURRDIR=`grep "CURRDIR" "$1" | cut -d"=" -f 2`
	CONFDIR=`grep "CONFDIR" "$1" | cut -d"=" -f 2`
	DATAMAE=`grep "DATAMAE" "$1" | cut -d"=" -f 2`
	LIBDIR=`grep "LIBDIR" "$1" | cut -d"=" -f 2`
	BINDIR=`grep "BINDIR" "$1" | cut -d"=" -f 2`
	ARRIDIR=`grep "ARRIDIR" "$1" | cut -d"=" -f 2`
	DATASIZE=`grep "DATASIZE" "$1" | cut -d"=" -f 2`
	LOGDIR=`grep "LOGDIR" "$1" | cut -d"=" -f 2`
	LOGEXT=`grep "LOGEXT" "$1" | cut -d"=" -f 2`
	MAXLOGSIZE=`grep "MAXLOGSIZE" "$1" | cut -d"=" -f 2`
	INICIARU=`grep "INICIARU" "$1" | cut -d"=" -f 2`
	INICIARF=`grep "INICIARF" "$1" | cut -d"=" -f 2`
	DETECTARU=`grep "DETECTARU" "$1" | cut -d"=" -f 2`
	DETECTARF=`grep "DETECTARF" "$1" | cut -d"=" -f 2`
	SUMARU=`grep "SUMARU" "$1" | cut -d"=" -f 2`
	SUMARF=`grep "SUMARF" "$1" | cut -d"=" -f 2`
	LISTARU=`grep "LISTARU" "$1" | cut -d"=" -f 2`
	LISTARF=`grep "LISTARF" "$1" | cut -d"=" -f 2`

}

function mostrarVariables {
	
	echo '
***********************************************************************
* Parámetros de Instalación del paquete  Consultar                    *
***********************************************************************'
	echo "
* Directorio de trabajo:
  	-> $CURRDIR
* Directorio de instalación:
  	-> $grupo/inst
* Directorio del archivo de configuración:
  	-> $grupo/conf
* Directorio de datos maestros:
  	-> $grupo/mae
* Directorio de ejecutables:
  	-> $BINDIR
* Librería de funciones:
  	-> $grupo/lib
* Directorio de arribos:
  	-> $ARRIDIR
* Espacio mínimo reservado en $ARRIDIR:
  	-> $DATASIZE Mb
* Directorio para los archivos de Log:
  	-> $LOGDIR
* Extensión para los archivos de Log:
  	-> $LOGEXT
* Tamaño máximo para cada archivo de Log:
  	-> $MAXLOGSIZE Kb
* Log de la instalación:
  	-> $grupo/inst
"
}

function preguntarSiONo {

	respuesta=""

	while [ "$respuesta" != "s" ]
	do
		if [ "$respuesta" == "n" ]; then
			echo "* Proceso de Instalación CANCELADO.
Copyright SisOp (c)2011
********************************************************
"			
			exit 0 
		fi
		echo "$1"
		read respuesta
	done

}

function mostrarMensajesInformativos {

	echo "
*********************************************************************
* Información general sobre los directorios del sistema             *
*********************************************************************
* Todos los directorios del sistema serán subdirectorios de:
  $grupo
* Todos los componentes de la instalación se obtendrán del repositorio:
  $grupo/inst
"

	ls -1 -Q $grupo/inst

	echo "
* El log de la instalación se almacenara en:
  $grupo/inst
* Al finalizar la instalación, si la misma fue exitosa,
* se dejará un archivo de configuración en:
  $grupo/conf
*********************************************************************
Presione cualquier tecla y ENTER para continuar"

read seguir
unset seguir

}

function mostrarMensajeInicioInstalacion {

	echo '
**************************************************************
* Proceso de Instalación del sistema Consultar
* Copyright TPSistemasOp (c)2011
**************************************************************
* Al instalar Consultar UD. expresa estar en un todo de acuerdo
* con los terminos y condiciones del "ACUERDO DE LICENCIA DE 
* SOFTWARE" incluido en este paquete.
**************************************************************
	'

}

function crearLogInstalacion {

	>> $grupo/inst/$nombre_log
	echo "<fecha y hora actual>-<Usuario>-instalarC-I-Inicio de Ejecucion" >> $grupo/inst/$nombre_log

}

function moverArchivos {

	echo "
Moviendo Archivos......."

	if ! [ -f "$grupo/mae/encuestas.mae" ]; then cp "$grupo/inst/maestros/encuestas.mae" "$grupo/mae"; fi
	if ! [ -f "$grupo/mae/encuestadores.mae" ]; then cp "$grupo/inst/maestros/encuestadores.mae" "$grupo/mae"; fi
	if ! [ -f "$grupo/mae/preguntas.mae" ]; then cp "$grupo/inst/maestros/preguntas.mae" "$grupo/mae"; fi

	if ! [ -f "$BINDIR/iniciarC.sh" ]; then
		cp "$grupo/inst/comandos/iniciarC.sh" "$BINDIR"
		fechaActual=`date +%F`
		horaActual=`date +%R`		
		INICIARF=`echo $fechaActual $horaActual`
		INICIARU=`whoami`
	fi
	
	if ! [ -f "$BINDIR/detectarC.sh" ]; then
		cp "$grupo/inst/comandos/detectarC.sh" "$BINDIR"
		fechaActual=`date +%F`
		horaActual=`date +%R`
		DETECTARF=`echo $fechaActual $horaActual`
		DETECTARU=`whoami`
	fi
	if ! [ -f "$BINDIR/sumarC.sh" ]; then
		cp "$grupo/inst/comandos/sumarC.sh" "$BINDIR"
		fechaActual=`date +%F`
		horaActual=`date +%R`
		SUMARF=`echo $fechaActual $horaActual`
		SUMARU=`whoami`
	fi
	if ! [ -f "$BINDIR/listarC.pl" ]; then
		cp "$grupo/inst/comandos/listarC.pl" "$BINDIR"
		fechaActual=`date +%F`
		horaActual=`date +%R`
		LISTARF=`echo $fechaActual $horaActual`
		LISTARU=`whoami`
	fi

}

function crearArchivoConfiguracion {

	> $CONFDIR/$nombre_config_file
	echo "CURRDIR=$CURRDIR
CONFDIR=$CONFDIR
DATAMAE=$DATAMAE
LIBDIR=$LIBDIR
BINDIR=$BINDIR
ARRIDIR=$ARRIDIR
DATASIZE=$DATASIZE
LOGDIR=$LOGDIR
LOGEXT=$LOGEXT
MAXLOGSIZE=$MAXLOGSIZE
INICIARU=$INICIARU
INICIARF=$INICIARF
DETECTARU=$DETECTARU
DETECTARF=$DETECTARF
SUMARU=$SUMARU
SUMARF=$SUMARF
LISTARU=$LISTARU
LISTARF=$LISTARF" > $CONFDIR/$nombre_config_file

}

function crearEstructurasDeDirectorios {

	echo "Creando Estructuras de Directorio.......
"

	listaDirectorios=(conf mae $dirBinarios $dirArribos $dirLogger rechazados preparados listos nolistos ya)

	for i in ${listaDirectorios[*]}; do
		echo "creando $i..."		
		crearDirectorio $i
	done

}

function crearDirectorio {

	path=""
	OIFS=$IFS
	IFS="/"
	arr=($1)


	for i in ${arr[*]} ; do
		path=$path$i
		if ! [ -d "$path" ]; then mkdir "$path"; fi
		path=$path/
	done

	IFS=$OIFS
	unset path

}

function validarExtensionLog {
	
	res=`echo "$1" | grep "^[.]"`
	if [  "$1" != "$res" ]; then
		echo "ERROR - La extensión del logger debe comenzar con un punto (.)"
		cond="error"
	fi
	unset res
}

function validarDirectorios {

	if [ -d "$1" ]; then
		echo "ERROR - el directorio ya existe"
		cond="error"
	fi

}

function validarListaDirecciones {

	for i in ${listaDirecciones[*]}; do
		if [ "$i" == "$1" ]; then
		echo "ERROR - No puede elegir más de una vez el mismo directorio"
		cond="error"	
		fi
	done

	listaDirecciones=(${listaDirecciones[*]} $1)

}


function definirDirArribos {

	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"	
		echo "
* Ingrese el nombre del directorio que permite el arribo de archivos externos:
* Sugerencia: ($ARRIDIR) "
		read dirArribos	
		validarDirectorios $dirArribos
		if [ $cond == "ok" ]; then validarListaDirecciones $dirArribos; fi
	done

	ARRIDIR=$grupo/$dirArribos
	unset cond

}

function definirDirEjecutables {

	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"	
		echo "
* Ingrese el nombre del subdirectorio de ejecutables:
* Sugerencia: ($BINDIR)"
		read dirBinarios
		validarDirectorios $dirBinarios
		if [ $cond == "ok" ]; then validarListaDirecciones $dirBinarios; fi
	done

	BINDIR=$grupo/$dirBinarios
	unset cond

}

function definirDirLogger {

	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"
		echo "
* Ingrese el nombre del directorio de log:
* Sugerencia ($LOGDIR)"
		read dirLogger
		validarDirectorios $dirLogger
		if [ "$cond" == "ok" ]; then validarListaDirecciones $dirLogger; fi
	done

	LOGDIR=$grupo/$dirLogger
	unset cond

}

function definirLogExt {

	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"
		echo "
* Ingrese la extensión para los archivos de log:
* Sugerencia: ($LOGEXT)"
		read extLogger
		validarExtensionLog $extLogger
	done
	unset cond
	
	LOGEXT=$extLogger


	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"
		echo "
* Ingrese el tamaño máximo para los archivos <LOGEXT> (en Kbytes):
* Sugerencia: ($MAXLOGSIZE)"
		read maxSize
		validarNumerico $maxSize
	done
	unset cond

	MAXLOGSIZE=$maxSize
}

function definirDataSize {

	cond="error"

	while [ $cond == "error" ]; do
		cond="ok"
		echo "
* Ingrese el espacio mínimo requerido para datos externos (en Mbytes):
* Sugerencia: ($DATASIZE)"
		read size
		validarNumerico $size
		if [ "$cond"  == "ok" ]; then validarEspacioEnDisco $size; fi
	done
	unset cond

	DATASIZE=$size

}

function validarEspacioEnDisco {

	espacio_libre=`df | grep sda5 | awk '{ print $4 }'` #en KB
	echo "Espacio Libre en Disco en KB: $espacio_libre "

	espacio_requerido=$[ $1 * 1024 ]   #paso de MB a KB

	if [ $espacio_requerido -gt $espacio_libre ]; then
		espacio_libre=$[ $espacio_libre / 1024 ] #paso de KB a MB		
		echo "Insuficiente espacio en disco. Espacio disponible: $espacio_libre Mb. Espacio requerido $1 Mb"
		cond="error"
	fi
}

function validarNumerico {

	res=`echo "$1" | grep "[^0-9]"`
	if [ "$1" == "$res" ]; then
		echo "ERROR -  \"$1\" tiene que ser un número entero."
		cond="error"
	fi
	unset res
}

function validarPerl {

	pathPerl=`which perl`
	validacionPerl="false"

	if [ "$?" == 0 ]; then
		version=` $pathPerl -v | grep "v[5-9]\."` 
		if [ -n "$version" ]; then
		validacionPerl="true"
		fi
	fi

	if [ $validacionPerl == "false" ]; then
		echo "Para instalar Consultar es necesario contar con  Perl 5 o superior instalado. Efectúe su instalación e inténtelo nuevamente. 
Proceso de Instalación Cancelado."
		exit 0
	fi

}

function testComandosInstalados {

	echo "
********************************************************
*  Proceso de Instalación del sistema Consultar          *
*  Copyright TPSistemasOp (c)2011                        *
********************************************************
* Se encuentran instalados los siguientes componentes:
"
	cont=0
	if [ -f $BINDIR/"iniciarC.sh" ]; then echo "* iniciarC.sh <$INICIARF> <$INICIARU>.";cont=$[ $cont + 1 ]; fi
	if [ -f $BINDIR/"detectarC.sh" ]; then echo "* detectarC.sh <$DETECTARF> <$DETECTARU>.";cont=$[ $cont + 1 ]; fi
	if [ -f $BINDIR/"listarC.pl" ]; then echo "* listarC.sh <$LISTARF> <$LISTARU>.";cont=$[ $cont + 1 ]; fi
	if [ -f $BINDIR/"sumarC.sh" ]; then echo "* sumarC.sh <$SUMARF> <$SUMARU>.";cont=$[ $cont + 1 ]; fi
	if [ $cont -lt 4 ]; then
		echo "
********************************************************"
		echo "* Falta instalar los siguientes componentes: "

		if ! [ -f $BINDIR/"iniciarC.sh" ]; then echo "* iniciarC.sh ";cant_errores=$[ $cant_errores + 1 ]; fi
		if ! [ -f $BINDIR/"detectarC.sh" ]; then echo "* detectarC.sh ";cant_errores=$[ $cant_errores + 1 ]; fi
		if ! [ -f $BINDIR/"listarC.pl" ]; then echo "* listarC.pl ";cant_errores=$[ $cant_errores + 1 ]; fi
		if ! [ -f $BINDIR/"sumarC.sh" ]; then echo "* sumarC.sh ";cant_errores=$[ $cant_errores + 1 ]; fi
	fi
	echo "
********************************************************"

}

	function testLibreriaDeComandos {

	LIBRERIAS=(mirarC.sh moverC.sh loguearC.sh startD.sh stopD.sh)

	for i in ${LIBRERIAS[*]}; do
		if ! [ -f $1/"$i" ]; then
			echo "* Falta el comando de librería: \"$i\""
			cant_errores=$[ $cant_errores + 1 ]
		fi
	done

}

function testArchivosMaestros  {

	MAESTROS=(encuestas.mae encuestadores.mae preguntas.mae)

	for i in ${MAESTROS[*]}; do
		if ! [ -f $1/"$i" ]; then
			echo "* Falta el archivo maestro: \"$i\""
			cant_errores=$[ $cant_errores + 1 ]	
		fi
	done

}

function testComandos  {

	EJECUTABLES=(iniciarC.sh detectarC.sh sumarC.sh listarC.pl)

	for i in ${EJECUTABLES[*]}; do
		if ! [ -f $1/"$i" ]; then
			echo "* Falta el ejecutable: \"$i\""
			cant_errores=$[ $cant_errores + 1 ]	
		fi
	done

}

function verificarMAXLOGSIZE {

	if [ -z "$MAXLOGSIZE" ]; then
		MAXLOGSIZE=400
		echo "No se encontró el tamaño máximo del archivo de Log.
Se toma por default:  DATASIZE=$DATASIZE"
		cant_errores=$[ $cant_errores + 1 ]
	fi

}

function verificarLOGEXT {

	if [ -z "$LOGEXT" ]; then
		LOGEXT=".log"
		echo "No se encontró la extensión del archivo de log.
Se toma por default:  DATASIZE=$LOGEXT"
		cant_errores=$[ $cant_errores + 1 ]
	fi

}

function verificarLIBDIR {
	
	if [ -z "$LIBDIR" ]; then
		LIBDIR="$grupo/lib"
		echo "No se encontró el nombre del directorio de librería de comandos.
Se toma por default:  LIBDIR=\"$grupo\lib\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if [ "$LIBDIR" != "$grupo/lib" ]; then
			LIBDIR="$grupo/lib"		
			echo "LIBDIR es inconsistente con el nombre del directorio de librería de comandos.
Se actualiza el mismo a: LIBDIR=\"$LIBDIR\""
			cant_errores=$[ $cant_errores + 1 ]	
		fi
	fi

	testLibreriaDeComandos "$LIBDIR"

}

function verificarDATAMAE {

	if [ -z "$DATAMAE" ]; then
		DATAMAE="$grupo/mae"
		echo "No se encontró el nombre del directorio de archivos maestros.
Se toma por default:  DATAMAE=\"$grupo\mae\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if [ "$DATAMAE" != "$grupo/mae" ]; then
			DATAMAE="$grupo/mae"		
			echo "DATAMAE es inconsistente con el nombre del directorio de archivos maestros.
Se actualiza el mismo a: DATAMAE=\"$DATAMAE\""
			cant_errores=$[ $cant_errores + 1 ]	
		fi
	fi

	testArchivosMaestros "$DATAMAE"

}

function verificarCONFDIR {

	if [ -z "$CONFDIR" ]; then
		CONFDIR="$grupo/conf"
		echo "No se encontró el nombre del directorio del archivo de configuración.
Se toma por default:  CONFDIR=\"$grupo\conf\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if [ "$CONFDIR" != "$grupo/conf" ]; then
			CONFDIR="$grupo/conf"		
			echo "CONFDIR es inconsistente con el nombre del directorio del archivo de configuración.
Se actualiza el mismo a: CONFDIR=\"$CONFDIR\""
			cant_errores=$[ $cant_errores + 1 ]	
		fi
	fi

}

function verificarBINDIR {

	if [ -z "$BINDIR" ]; then
		BINDIR="$grupo/bin"
		echo "No se encontró el directorio de ejecutables en el archivo de configuración.
Se toma por default:  BINDIR=\"$BINDIR\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if ! [ -d "$BINDIR" ]; then
			BINDIR="$grupo/bin"
			echo "El directorio de ejecutables especificado en el archivo de configuración, no existe.
Se toma por default:  BINDIR=\"$BINDIR\""
			cant_errores=$[ $cant_errores + 1 ]
		fi
	fi

	testComandosInstalados

}

function verificarCURRDIR {

	if [ -z "$CURRDIR" ]; then
		CURRDIR="$grupo"
		echo "No se encontró el nombre del directorio actual.
Se toma por default:  CURRDIR=\"$grupo\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if [ "$CURRDIR" != "$grupo" ]; then
			CURRDIR="$grupo"		
			echo "CURRDIR es inconsistente con el nombre del directorio actual.
Se actualiza el mismo a: CURRDIR=\"$CURRDIR\""	
			cant_errores=$[ $cant_errores + 1 ]
		fi
	fi

}

function verificarDATASIZE {

	if [ -z "$DATASIZE" ]; then
		DATASIZE=100
		echo "No se encontró el tamaño mínimo de espacio en disco para la aplicación.
Se toma por default:  DATASIZE=$DATASIZE"
		cant_errores=$[ $cant_errores + 1 ]
	fi

}

function verificarARRIDIR {

	if [ -z "$ARRIDIR" ]; then
		ARRIDIR="$grupo/arribos"
		echo "No se encontró el directorio de arribos en el archivo de configuracion.
Se toma por default:  ARRIDIR=\"$ARRIDIR\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if ! [ -d "$ARRIDIR" ]; then
			ARRIDIR="$grupo/arribos"
			echo "El directorio de arribos especificado en el archivo de configuracion, no existe.
Se toma por default:  ARRIDIR=\"$ARRIDIR\""
			cant_errores=$[ $cant_errores + 1 ]
		fi
	fi

}

function verificarLOGDIR {

	if [ -z "$LOGDIR" ]; then
		LOGDIR="$grupo/log"
		echo "No se encontró el directorio del archivo de Log en el archivo de configuracion.
Se toma por default:  LOGDIR=\"$LOGDIR\""
		cant_errores=$[ $cant_errores + 1 ]
	else
		if ! [ -d "$LOGDIR" ]; then
			LOGDIR="$grupo/log"
			echo "El directorio del archivo de Log especificado en el archivo de configuracion, no existe.
Se toma por default:  LOGDIR=\"$LOGDIR\""
			cant_errores=$[ $cant_errores + 1 ]
		fi
	fi

}

function verificarArchivosSistemas {

	cant_errores=0

	testLibreriaDeComandos "$grupo/lib"
	testArchivosMaestros "$grupo/inst/maestros"
	testComandos "$grupo/inst/comandos"

	if [ $cant_errores -gt 0 ]; then
		echo "********************************************************
Proceso de Instalación cancelado.
Asegúrese de que contar con los archivos arriba mencionados y vuelva a intentar.
********************************************************"	
		exit 0
	fi

}

function verificarComponentesInstalados {

	verificarBINDIR
	verificarLIBDIR
	verificarDATAMAE

}

function verificarValoresDelArchivoDeConfiguracion {

	verificarCURRDIR
	verificarARRIDIR
	verificarLOGDIR
	verificarDATASIZE
	verificarCONFDIR
	verificarLOGEXT
	verificarMAXLOGSIZE

}

function comenzarInstalacion {

	mostrarMensajeInicioInstalacion

	preguntarSiONo "Acepta los términos? [s/n]:" 

	clear

	validarPerl

	mostrarMensajesInformativos
	
	while [ "$respuesta1" != "s" ]
	do	
		clear
	
		echo '*********************************************************************
* Inicio carga de parámetros globales del sistema                   *
*********************************************************************'	
		listaDirecciones=()

		definirDirArribos

		definirDirEjecutables

		definirDirLogger

		definirLogExt

		definirDataSize

		clear

		mostrarVariables

		echo '*********************************************************************
Si los datos ingresados son correctos presione "s" y ENTER para continuar,
si desea modificar algún parámetro oprima cualquier tecla para reiniciar
'
		read respuesta1
	done

	preguntarSiONo "Iniciando Instalación… Está UD. seguro? [s/n]" 

	crearEstructurasDeDirectorios
	moverArchivos
	crearArchivoConfiguracion

	#crea archivo con el path del archivo de configuracion
	> $BINDIR/rutaConfigFile ; echo "$grupo/conf" > $BINDIR/rutaConfigFile

}

function completarInstalacion {

	echo "Presione ENTER para continuar."
	read seguir
	unset seguir

	mostrarVariables
	preguntarSiONo "Se procederá con la instalación con los parámetros arriba mostrados. Está usted seguro? [s/n]:" 
	crearEstructurasDeDirectorios
	moverArchivos
	crearArchivoConfiguracion
	testComandosInstalados
	> $BINDIR/rutaConfigFile ; echo "$grupo/conf" > $BINDIR/rutaConfigFile
	
}

function main {

	cd ..
	clear

	grupo="$PWD"
	nombre_config_file="instalarC.conf"
	nombre_log="instalarC.log"


	echo "********************************************************
*   Bienvenido al Asistente de instalación del	
*   Sistema Consultar Copyright SisOp (c)2011          *
********************************************************"

	crearLogInstalacion
	verificarArchivosSistemas

	if ! [ -f "conf/$nombre_config_file" ]; then

		inicializarVariablesDefault
		comenzarInstalacion
		testComandosInstalados
	else

		leerVariablesDeConfiguracion "conf/$nombre_config_file"
		cant_errores=0
		verificarComponentesInstalados
		verificarValoresDelArchivoDeConfiguracion

		if [ $cant_errores -gt 0 ]; then 
			completarInstalacion
		fi
	fi

	echo "* FIN del Proceso de Instalación Copyright SisOp (c)2011
********************************************************
"
}

main

